package com.cs.framework.jdbc.hibernate3.session.app;

import java.util.Properties;

import org.springframework.core.io.Resource;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;

import com.cs.framework.common.util.IOUtils;
import com.cs.framework.core.util.CoreConstant;
import com.cs.framework.jdbc.common.util.DBConstant;
import com.cs.framework.jdbc.hibernate3.exception.HibernateExceptionHelper;
import com.cs.framework.jdbc.hibernate3.session.AbstractHibernateSessionFactory;

/**
 * 支持Hibernate注解的SessionFactory，用于创建和更新表格
 * 
 * @author hedongzhou
 * 
 */
public class UpdateTableSessionFactory extends AbstractHibernateSessionFactory {

	/**
	 * 构建工厂
	 */
	public void buildSessionFactory() throws Exception {
		// 创建SessionFactory
		sessinFactoryBean = new AnnotationSessionFactoryBean();
		// 获取数据源
		sessinFactoryBean.setDataSource(dataSource);

		// 扫描package底下的注解类
		sessinFactoryBean.setPackagesToScan("com" + DBConstant.MODULE_DTO_PATHPATTERN);

		// 查找映射文件
		Resource[] mappingRes = IOUtils.loadResource(CoreConstant.CLASSPATH_PATTERN
				+ DBConstant.MODULE_HIBERNATE_CUSTOM_CONF);
		if (mappingRes != null && mappingRes.length > 0) {
			// 添加映射文件
			sessinFactoryBean.setMappingLocations(mappingRes);
		}

		// 判断是否指定了属性配置文件路径
		if (propertiesPath == null) {
			HibernateExceptionHelper.throwJdbcException("H001");
		} else {
			Resource res = IOUtils.loadOneResource(propertiesPath);

			// 判断是否存在属性配置文件
			if (res == null) {
				HibernateExceptionHelper.throwJdbcException("H002");
			} else {
				// 获取属性配置信息
				hibernateProperties = new Properties();
				hibernateProperties.load(res.getInputStream());

				// 设置为更新表
				hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update");

				// 设置hibernate属性
				sessinFactoryBean.setHibernateProperties(hibernateProperties);
			}
		}

		sessinFactoryBean.afterPropertiesSet();
	}

}
